﻿/**
 * @author: rayzhang
 * @desc: theme manager
 * @todo:编写一个轻量 tiny qt less like parser 用于减少模板样式代码
 */
#pragma once

#include <QString>
#include <QVariant>
#include <QProperty>
#include "qtheme_global.h"
namespace qui
{
class LIBQTHEME_API QTheme final
{
    using ThemeData = QMap<QString, QVector<QString>>;
    // Q_OBJECT
public:
    QTheme() = default;
    // static QTheme& instance();
    /**
     * \brief 添加主题
     * \param name 主题名
     * \param styleFile 样式表文件路径
     * \return 文件不存在将会添加失败
     */
    bool addTheme(const QString& name, const QString& styleFile);
    // 设置当前主题
    bool setCurrentTheme(const QString& name);

    QBindable<QString> currentTheme() const;
    // 获取主题
    QStringList themes() const;
    // 刷新主题
    void reload();
    // 获取主题变量包括用户变量
    QVariant variable(QString name, const QVariant& defaultValue = {}) const;
    /**
     * \brief 用户变量
     *
     * \desc 比如，可以在配置文件中存储一个变量@primaryColor，程序运行先读取该变量，设置到用户变量，然后在样式表中使用该变量，
     * 当修改了配置文件后，调用reload()方法，会重新解析样式表，然后更新样式表, 以达到切换主题样式的目的。
     */
    void addUserVariable(QStringView name, const QVariant& value);
    // signals:
    // void themeChanged(const QString& name);

private:
    // 主题
    QProperty<QString> _currentTheme;
    ThemeData _themes;
    QVariantMap _themeVariables;
    QVariantMap _userVariables;
};
} // namespace qui
